package com.ruoyi.xag.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.web.domain.server.Sys;
import com.ruoyi.xag.domain.Login;
import com.ruoyi.xag.mapper.SessionMapper;
import com.ruoyi.xag.service.SessionService;
import com.ruoyi.xag.utils.CreateSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @author LiSuxuan
 * @date 2021年 06月 21日 21:25
 * <p>
 * IOT 登录获取 Session 部分
 */
@Service
public class SessionServiceImpl implements SessionService {

    @Autowired
    private SessionMapper sessionMapper;

    /**
     * IOT 客户唯一ID
     */
    @Value("${iot.clientId}")
    private String clientId;

    /**
     * IOT 设备密钥
     */
    @Value("${iot.secret}")
    private String secret;

    /**
     * IOT 设备密钥
     */
    @Value("${iot.iotUrl}")
    private String iotUrl;

    /**
     * IOT 用户ID
     */
    @Value("${iot.account}")
    private String account;

    /**
     * IOT 用户密码
     */
    @Value("${iot.password}")
    private String password;

    /**
     * 检测 session 有效期
     *
     * @return 有效 session
     * @throws IOException IO异常
     */
    @Override
    public String checkSession() throws IOException {
        long currentTimeMillis = System.currentTimeMillis();
        Login login = sessionMapper.selectIotAccount(clientId);
        long intervalTime = 0;
        // 11.5小时间隔时间 session有效期12小时
        long elevenPointFiveHours = 41400000L;
        // 判断 session 过期时间，渐少系统开销
        if (login.getUpdateTime() != null) {
            intervalTime = currentTimeMillis - login.getUpdateTime();
        }
        if (intervalTime <= elevenPointFiveHours) {
            return login.getSession();
        } else {
            // 获取鉴权参数
            String authenticationUrl = CreateSignature.mergeAuthenticationUrl(clientId, secret);
            // 登录 URL 获取session
            String getSessionUrl = iotUrl + "/v5/login" + authenticationUrl;
            // 实例化账户相关信息信息
            Login newLogin = new Login(clientId, account, password);
            // 转换为 JSON 类型
            String bodyJson = JSON.toJSONString(newLogin);
            // 调用 POST Body 传参
            String result = HttpUtils.postByBody(getSessionUrl, bodyJson);
            String session = (String) JSON.parseObject(result).get("session");
            // 补全参数信息，进行持久化
            newLogin.setSession(session);
            newLogin.setUpdateTime(System.currentTimeMillis());
            // 还需添加session持久化以及判断session是否过期机制
            sessionMapper.insetOrUpdateLogin(newLogin);
            return session;
        }
    }

}
